/*
 * Copyright 2010,2011 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt.liste;


import org.eclipse.swt.widgets.Composite;

import de.mnit.basis.daten.struktur.S_Folge;
import de.mnit.basis.daten.struktur.container.Engpass;
import de.mnit.basis.daten.struktur.tabelle.S_Tabelle;
import de.mnit.basis.swt.anw.A_MN_Gruppe;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.layout.LayoutMax;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.event.S_Zuhoerer;
import de.mnit.schnipsel.db.DBManager;
import de.mnit.schnipsel.zentral.SC_GuiObs;


/**
 * @author Michael Nitsche
 */
public class K_Liste2 extends A_MN_Gruppe<K_Liste2> implements S_KListe {

	public static void main(String[] args)   { start(K_Liste2.class,600,400); }

	private static final String E_AUSWAHL="AUSWAHL";
	private static final String E_ANZAHL="ANZAHL";

	private Object aktuellObj=null;
	private LISTENAKTION aktuellTyp=null;
	private Integer neuerEintrag=null;
	public K_ListeEinfach k_tabelle = new K_ListeEinfach();


	public S_Folge<Integer> gAuswahlIDs() {
		return this.k_tabelle.gAuswahlIDs();
	}

	public void sNeueID(int id) {
		this.neuerEintrag=id;
	}

	public void speichernEnde() {
		this.k_tabelle.speichernEnde();
	}

	public void eAuswahl(S_Zuhoerer<Integer> z) {
		t.zuhoererPlus(E_AUSWAHL, z);
	}

	public void eAnzahl(S_Zuhoerer<int[]> z) {
		t.zuhoererPlus(E_ANZAHL, z);
	}

	public void anzeigenSuche() {
		anzeigenSuche("");
	}

	public void anzeigenSuche(String suche) {
		anzeigenSuche(suche, Engpass.neu(false));
	}

	public void anzeigenSuche(String suche, boolean event) {
		anzeigenSuche(suche, event, Engpass.neu(false));
	}

	public void anzeigenSuche(String suche, Engpass<Boolean> abbruch) {
		anzeigenSuche(suche, true, abbruch);
	}

	private void anzeigenSuche(String suche, boolean event, Engpass<Boolean> abbruch) {
		if(abbruch.g()) return;
		this.aktuellTyp=LISTENAKTION.SUCHE;
		this.aktuellObj=suche;
		S_Tabelle<String> dberg=DBManager.schnipsel().gTabSuche2(suche);
		if(abbruch.g()) return;
		this.k_tabelle.sInhalt(dberg, abbruch);
		if(abbruch.g()) return;
		iEventAnzahl(false, event);
	}

	public void anzeigenAst(Integer astId) {
		anzeigenAst(astId, true);
	}

	private void anzeigenAst(Integer astId, boolean anzeigen) {
		this.aktuellTyp=LISTENAKTION.AST;
		this.aktuellObj=astId;
		S_Tabelle<String> dberg;
		if(astId==null) {
			Ausgabe.warnung(astId);
			dberg=DBManager.schnipsel().gTabSuche2(null);
		}
		else
			dberg=DBManager.schnipsel().gTabAst2(astId);
		this.k_tabelle.sInhalt(dberg, null);
		iEventAnzahl(false, anzeigen);
	}

	public void anzeigenLose() {
		anzeigenLose(true);
	}

	private void anzeigenLose(boolean event) {
		this.aktuellTyp=LISTENAKTION.LOSE;
		this.aktuellObj=null;
		S_Tabelle<String> dberg=DBManager.schnipsel().gTabAst2(null);
		this.k_tabelle.sInhalt(dberg, null);
		iEventAnzahl(false, event);
	}

	public void anzeigenMuell() {
		anzeigenMuell(true);
	}

	private void anzeigenMuell(boolean event) {
		this.aktuellTyp=LISTENAKTION.MUELL;
		this.aktuellObj=null;
		S_Tabelle<String> dberg=DBManager.schnipsel().gTabMuell2();
		this.k_tabelle.sInhalt(dberg, null);
		iEventAnzahl(true, event);
	}

	public void aktualisieren() {
		aktualisieren(true, false);
	}

	public void aktualisierenBeiSpeichern() {
		aktualisieren(false, true);
	}

	private void aktualisieren(boolean event, boolean leersuche) {
		if(this.aktuellTyp==null)
			return;
		if(this.aktuellTyp==LISTENAKTION.LOSE)
			anzeigenLose(event);
		if(this.aktuellTyp==LISTENAKTION.MUELL)
			anzeigenMuell(event);
		if(this.aktuellTyp==LISTENAKTION.SUCHE)
			anzeigenSuche(leersuche ? "" : ""+this.aktuellObj, event);
		if(this.aktuellTyp==LISTENAKTION.AST)
			anzeigenAst((Integer)this.aktuellObj);
	}

	public void sAuswahlAlles() {
		t.k_tabelle.sAuswahlAlles();
	}

	public void sAuswahl(Integer id) {
		this.k_tabelle.sAuswahl(id);
	}

	public void spaltenAnpassen() {
		this.k_tabelle.spaltenAnpassen();
	}

	// ERZEUGEN

	protected S_SWT_Komponente<?, ? extends Composite> layout() {
		return LayoutMax.neu(t.k_tabelle);
	}

	protected void initStyle() {
	}

	protected void initEvents() {
		this.k_tabelle.eAuswahl(new S_Zuhoerer<Integer>(){
			public void verarbeite(Integer id) {
				t.zuhoererStart(E_AUSWAHL, id);
			}
		});
	}

	// INTERN

	private void iEventAnzahl(boolean muell, boolean event) {
		int aktuell=t.k_tabelle.gLaenge();
		int gesamt=DBManager.schnipsel().gAnzahlGesamt(muell);
		t.zuhoererStart(E_ANZAHL, new int[] {aktuell,gesamt});
		SC_GuiObs.i().anzahl().setze(aktuell, gesamt);
		if(event)
			iEventAuswahl(aktuell);
	}

	private void iEventAuswahl(int anzahl) {
		if(this.neuerEintrag!=null) {
			t.sAuswahl(t.neuerEintrag);
			t.zuhoererStart(E_AUSWAHL, t.neuerEintrag);
			t.neuerEintrag=null;
			return;
		}
		if(SC_GuiObs.i().anzeige().istNeuGeaendert())
			return;

		if(anzahl==1) {
			Ausgabe.debug();
			int id=this.k_tabelle.gID1();
			t.zuhoererStart(E_AUSWAHL, id);
			sAuswahl(id);
		}
		else t.zuhoererStart(E_AUSWAHL, null);
	}

}
